package com.java.JDBCView;

import java.util.List;
import java.util.Scanner;

public class Main {

    private static Scanner scanner = new Scanner(System.in);

    /**
     * 主程序入口
     * 提供一个简单的用户界面，让用户选择登录、注册或退出
     */
    public static void main(String[] args) {
        // 创建一个Scanner对象以读取用户输入
        Scanner scanner = new Scanner(System.in);

        // 无限循环，直到用户选择退出
        while (true) {
            // 显示用户操作选项
            System.out.println("请选择操作：");
            System.out.println("1. 登录");
            System.out.println("2. 注册");
            System.out.println("0. 退出");

            // 读取用户的选择
            int choice = scanner.nextInt();
            // 清除缓冲区中的换行符
            scanner.nextLine();

            // 根据用户选择执行对应操作
            switch (choice) {
                case 1:
                    // 调用登录函数
                    login();
                    break;
                case 2:
                    // 调用注册函数
                    register();
                    break;
                case 0:
                    // 退出程序
                    System.exit(0);
                default:
                    // 处理无效输入
                    System.out.println("无效的选择，请重新选择。");
            }
        }
    }

    /**
     * 登录功能方法
     * 此方法实现用户登录逻辑，包括用户输入、验证用户名和密码以及登录后的操作
     */
    private static void login() {
        // 提示用户输入用户名
        System.out.println("请输入用户名：");
        // 读取用户输入的用户名
        String username = scanner.nextLine();
        // 提示用户输入密码
        System.out.println("请输入密码：");
        // 读取用户输入的密码
        String password = scanner.nextLine();

        // 使用JDBC工具类执行SQL查询，验证用户名和密码的正确性
        List<User> users = JDBCUtils.executeQuery(User.class, "SELECT * FROM users WHERE username = ? AND password = ?", username, password);

        // 根据查询结果判断登录是否成功
        if (!users.isEmpty()) {
            // 如果查询结果不为空，表示登录成功
            System.out.println("登录成功！");
            // 显示学生菜单
            showStudentMenu();
        } else {
            // 如果查询结果为空，表示登录失败，用户名或密码错误
            System.out.println("登录失败，用户名或密码错误。");
        }
    }

    /**
     * 注册新用户
     * 此方法通过用户输入的用户名和密码进行新用户的注册
     * 它首先提示用户输入用户名和密码，然后通过JDBCUtils工具类执行SQL语句将数据插入到数据库中
     * 最后，根据执行结果提供注册成功或失败的反馈
     */
    private static void register() {
        // 提示用户输入用户名
        System.out.println("请输入用户名：");
        String username = scanner.nextLine();
        // 提示用户输入密码
        System.out.println("请输入密码：");
        String password = scanner.nextLine();

        // 使用JDBCUtils执行SQL语句，将用户名和密码插入到数据库中
        int result = JDBCUtils.executeUpdate("INSERT INTO users (username, password) VALUES (?, ?)", username, password);

        // 根据SQL语句执行结果，判断用户注册是否成功
        if (result > 0) {
            System.out.println("注册成功！");
        } else {
            System.out.println("注册失败。");
        }
    }

    /**
     * 显示学生管理菜单
     * 该方法呈现一个循环菜单，直到用户选择返回上一级菜单为止
     */
    private static void showStudentMenu() {
        while (true) {
            System.out.println("请选择操作：");
            System.out.println("1. 显示所有学生");
            System.out.println("2. 添加学生");
            System.out.println("3. 删除学生（按ID删除）");
            System.out.println("0. 返回上一级菜单");

            // 读取用户选择
            int choice = scanner.nextInt();
            scanner.nextLine(); // 清除缓冲区

            switch (choice) {
                case 1:
                    // 显示所有学生信息
                    displayAllStudents();
                    break;
                case 2:
                    // 添加新学生
                    addStudent();
                    break;
                case 3:
                    // 删除学生
                    deleteStudent();
                    break;
                case 0:
                    // 返回上一级菜单
                    return;
                default:
                    System.out.println("无效的选择，请重新选择。");
            }
        }
    }

    /**
     * 显示所有学生的信息
     * 此方法通过查询数据库中的学生表来获取学生信息，并将所有学生信息打印到控制台
     * 使用JDBCUtils类中的方法执行数据库查询，并将结果转换为Student对象列表
     * 遍历学生列表，并使用System.out.println方法打印每个学生的信息
     */
    private static void displayAllStudents() {
        // 从数据库中查询所有学生信息
        List<Student> students = JDBCUtils.executeQuery(Student.class, "SELECT * FROM students");
        // 遍历学生列表并打印每个学生的信息
        for (Student student : students) {
            System.out.println(student);
        }
    }

    /**
     * 添加学生信息的方法
     * 该方法通过用户输入收集学生的姓名、年龄和年级信息，并使用JDBCUtils工具类将这些信息插入到数据库中
     * 不返回任何值
     */
    private static void addStudent() {
        // 提示用户输入学生姓名，并读取姓名
        System.out.println("请输入学生姓名：");
        String name = scanner.nextLine();

        // 提示用户输入学生年龄，并读取年龄
        System.out.println("请输入学生年龄：");
        int age = scanner.nextInt();

        // 清除缓冲区，避免输入年龄后的换行符影响后续输入
        scanner.nextLine();

        // 提示用户输入学生年级，并读取年级
        System.out.println("请输入学生年级：");
        String grade = scanner.nextLine();

        // 使用JDBCUtils工具类执行SQL语句，将学生信息插入到数据库中
        int result = JDBCUtils.executeUpdate("INSERT INTO students (name, age, grade) VALUES (?, ?, ?)", name, age, grade);

        // 根据SQL语句执行结果，判断学生信息是否添加成功
        if (result > 0) {
            System.out.println("添加学生成功！");
        } else {
            System.out.println("添加学生失败。");
        }
    }

    /**
     * 删除学生信息
     * 此方法通过用户输入的学生ID来删除学生记录
     */
    private static void deleteStudent() {
        // 提示用户输入要删除的学生ID
        System.out.println("请输入要删除的学生ID：");
        // 获取用户输入的学生ID
        int id = scanner.nextInt();

        // 执行SQL删除操作，这里的SQL语句使用了参数占位符来防止SQL注入
        int result = JDBCUtils.executeUpdate("DELETE FROM students WHERE id = ?", id);

        // 根据SQL执行结果判断是否删除成功
        if (result > 0) {
            System.out.println("删除学生成功！");
        } else {
            System.out.println("删除学生失败。");
        }
    }

}